home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 026-050 / 045 / whereis / whereis.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  5KB  |  227 lines

  1. /* Find the file whose name matches that passed as first argument.
  2.  * Print the filename and its volume:path to the screen
  3.  */
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include <exec/types.h>
  7. #include <devices/keymap.h>
  8. #include <intuition/intuition.h>
  9. #include <libraries/dosextens.h>
  10.  
  11. #define BELL 0x07
  12. /*
  13.  *                 F U N C T I O N     D E C L A R A T I O N S
  14.  */
  15. extern struct FileLock * Lock();
  16.  
  17. BOOL ifoundit;
  18. /* home grown subrs: */
  19. void close_things();
  20.  
  21. /*
  22.  *                  M A I N     P R O G R A M     M O D U L E
  23.  */
  24. void
  25. main( argc,argv)
  26. int argc;
  27. char * argv[];
  28. {
  29.     void scan_directory ();
  30.     struct FileLock * Lock ();
  31.     void UnLock ();
  32.     char * strcpy ();
  33.  
  34.     struct FileLock * dir;
  35.     struct FileInfoBlock * fb;
  36.     char path[130];            /* hold volume name */
  37.     char devname[32];
  38.     char searchfile[32];
  39.     char * ch;
  40.     UBYTE i;
  41.  
  42.     if ((argc > 3) || (argc == 1))
  43.         printf ("usage: whereis <filename> <devname>\n");
  44.     else
  45.         {
  46.         ifoundit = FALSE;
  47.         /* devname not specified */
  48.         if (argc == 2)
  49.             devname[0] = '\0';
  50.         else
  51.             {
  52.             for (i=0;i<32;i++)
  53.                 devname[i] = '\0';
  54.             strncpy (devname,argv[2],31);
  55.             }
  56.         strcpy (searchfile, argv[1]);
  57.         /* upcase input string, simplify matching process */
  58.         for (ch=searchfile; *ch != '\0'; ch++)
  59.             *ch = toupper (*ch);
  60.         /* Get Lock on disk */
  61.         if ( (dir = Lock (devname,ACCESS_READ)) == NULL)
  62.             {
  63.             printf ("Could not obtain lock on device %s\n",
  64.                 devname);
  65.             printf ("Then Die Ceasar\n");
  66.             close_things ();
  67.             exit (5);
  68.             }
  69.         else
  70.             strcpy (path, devname);
  71.         /* DO IT TO IT! */
  72.         scan_directory (searchfile,path);
  73.         }
  74.     close_things ();
  75. } /* end main */
  76.  
  77. /*
  78. .page.index close_index
  79. Do whatever final clean up is needed to leave the program.
  80.  */
  81. void
  82. close_things()
  83. {
  84.     if (!ifoundit)
  85.         printf ("Sorry, couldn't find it.\n");
  86.     return;
  87. } /* end close_things */
  88.  
  89.  
  90. /*
  91. .page.index scan_directory
  92.  */
  93. void
  94. scan_directory (searchfile,path)
  95. char * searchfile;
  96. char * path;
  97.     {
  98.     char * strcpy ();
  99.     void UnLock ();
  100.     struct FileLock * dir;
  101.     struct FileInfoBlock * fb;
  102.     char * adddir ();
  103.  
  104.     /* WE GOTTA BE STINGY WITH LOCAL STORAGE, THIS IS RECURSING!
  105.      * CAN'T EAT TOO MUCH STACK.
  106.      */
  107. #    define MAXSUB 50
  108.     char * subdir [MAXSUB];    /* Pointer area for Sub-Directories */
  109.     char pathname[130];    /* Pointers to AmigaDOS sub-directories */
  110.     UBYTE countdir,indexdir,i;
  111.     char testname[32];
  112.     char * ch;
  113.  
  114.     /* Get Lock on this directory */
  115.     if ( (dir = Lock (path,ACCESS_READ)) == NULL)
  116.         {
  117.         printf ("%cCould not obtain lock on directory %s\n",
  118.             BELL, path);
  119.         printf ("Then Die Ceasar\n");
  120.         close_things ();
  121.         exit (4);
  122.         }
  123.  
  124.     /* Examine lock and obtain FileInfoBlock */
  125.     fb=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),0);
  126.     if (!Examine (dir,fb))
  127.         {
  128.         printf ("%cCouldn't Examine files assoc with lock\n",BELL);
  129.         printf ("Then Die Ceasar\n");
  130.         UnLock (dir);
  131.         FreeMem ((char *)fb, sizeof (struct FileInfoBlock));
  132.         close_things ();
  133.         exit (4);
  134.         }
  135.     /* we now have dir and fb set up, 
  136.      * scan all files at this level 
  137.      * (remembering subdirectories)
  138.      */
  139.     countdir = 0;
  140.     while ((ExNext(dir,fb),IoErr() != ERROR_NO_MORE_ENTRIES) 
  141.         && (countdir <= MAXSUB)
  142.         ) 
  143.         {
  144.         if (fb->fib_DirEntryType > 0)
  145.             {
  146.             /* we have a subdirectory here... */
  147.             if (countdir < MAXSUB)
  148.                 subdir[countdir] = 
  149.                     adddir (fb->fib_FileName);
  150.             else
  151.                 printf ("%cToo few subdirectory slots\n",
  152.                     BELL);
  153.             countdir++;
  154.             }
  155.         else
  156.             {
  157.             /* compare fb->filename with searchfile */
  158.             for (i=0;i<32;i++)
  159.                 testname[i] = '\0';
  160.             strncpy (testname,fb->fib_FileName, 32);
  161.             testname[31] = '\0';
  162.             for (i = 0,ch=testname; (ch != '\0')&&(i<32); 
  163.                 i++,ch++)
  164.                 *ch = toupper (*ch);
  165. #            if 0
  166.             printf ("%s =?= %s\n",testname, searchfile);
  167. #            endif
  168.             if (strcmp (testname,searchfile)==0)
  169.                 {
  170.                 printf ("%s\t%s\n",testname,path);
  171.                 ifoundit = TRUE;
  172.                 }
  173.             }
  174.         } /* end while */
  175.     /* return these now, we're done, thank you. */
  176.     UnLock (dir);
  177.     FreeMem ((char *)fb, sizeof (struct FileInfoBlock));
  178.  
  179.     /* finished with this level, try one level down */
  180.     indexdir = 0;
  181.     while (indexdir < countdir)
  182.         {
  183.         strcpy (pathname,path);
  184.         /* if no path delimiter, add one */
  185.         if (       (path[strlen(path)-1] != ':') 
  186.             && (path[strlen(path)-1] != '/') 
  187.             && (strlen(path) > 0))
  188.                   strcat (pathname,"/");
  189.         strcat (pathname,subdir[indexdir]);
  190.  
  191.         scan_directory (searchfile,pathname);
  192.  
  193.         /* and pick up litter left by adddir() */
  194.         FreeMem ((char *)subdir[indexdir],
  195.             strlen(subdir[indexdir])+1);
  196.         subdir[indexdir] = NULL;
  197.         indexdir++;
  198.         }
  199.  
  200.     return;
  201. }    /* end scan_directory */
  202.  
  203. /*
  204. .page.index adddir
  205.  ----------------------------------------------------------------------------
  206.     Allocate some memory and then copy string into it.
  207.  */
  208. char * adddir (string)
  209. char * string;
  210. {
  211.     char * nameadd;    /* Address of the directory name */
  212.  
  213.     nameadd = (char *) AllocMem (strlen(string)+1,0);
  214.     if (nameadd == NULL)
  215.         {
  216.         printf ("Not Enough Memory for Directories!!!\n");
  217.         /* run away! run away! */
  218.         close_things ();
  219.         exit (7);
  220.         }
  221.     strcpy (nameadd, string);
  222.  
  223.     /* return address of string you just alloated. */
  224.     return (nameadd);
  225.  
  226. }    /*end adddir*/
  227.